﻿package com.amcharts.geom
{
    import com.amcharts.utils.*;
    import flash.geom.*;

    public class Bezier extends ExtendedSprite
    {
        static const VERSION:String = "1.8.3.1";

        public function Bezier(param1:Array, param2:Array, param3:uint = 0, param4:Number = 1, param5:Number = 0, param6:Number = 0, param7:Number = 0)
        {
            var _loc_11:Array = null;
            var _loc_8:* = param1.length;
            this.graphics.lineStyle(param5, param3, param4);
            if (param7 > 0)
            {
                this.graphics.beginFill(param6, param7);
            }
            this.graphics.moveTo(param1[0], param2[0]);
            var _loc_9:* = new Array();
            var _loc_10:Number = 0;
            while (_loc_10 < _loc_8)
            {
                
                _loc_9.push(new Point(param1[_loc_10], param2[_loc_10]));
                _loc_10 = _loc_10 + 1;
            }
            if (_loc_9.length > 1)
            {
                _loc_11 = interpolate(_loc_9);
                drawBeziers(_loc_11);
            }
            return;
        }// end function

        private function drawBeziers(param1:Array) : void
        {
            var _loc_2:Number = 0;
            while (_loc_2 < (param1.length - 1) / 3)
            {
                
                drawBezierMidpoint(param1[3 * _loc_2], param1[3 * _loc_2 + 1], param1[3 * _loc_2 + 2], param1[3 * _loc_2 + 3]);
                _loc_2 = _loc_2 + 1;
            }
            return;
        }// end function

        private function interpolate(param1:Array) : Array
        {
            var _loc_8:Point = null;
            var _loc_9:Point = null;
            var _loc_10:Point = null;
            var _loc_11:Number = NaN;
            var _loc_2:* = new Array();
            _loc_2.push(new Point(param1[0].x, param1[0].y));
            var _loc_3:* = param1[1].x - param1[0].x;
            var _loc_4:* = param1[1].y - param1[0].y;
            _loc_2.push(new Point(param1[0].x + _loc_3 / 6, param1[0].y + _loc_4 / 6));
            var _loc_5:Number = 3;
            var _loc_6:Number = 6;
            var _loc_7:Number = 1;
            while (_loc_7 < (param1.length - 1))
            {
                
                _loc_8 = param1[(_loc_7 - 1)];
                _loc_9 = param1[_loc_7];
                _loc_10 = param1[(_loc_7 + 1)];
                _loc_3 = _loc_10.x - _loc_9.x;
                _loc_4 = _loc_10.y - _loc_8.y;
                _loc_11 = _loc_9.x - _loc_8.x;
                if (_loc_11 > _loc_3)
                {
                    _loc_11 = _loc_3;
                }
                _loc_2.push(new Point(_loc_9.x - _loc_11 / _loc_5, _loc_9.y - _loc_4 / _loc_6));
                _loc_2.push(new Point(_loc_9.x, _loc_9.y));
                _loc_2.push(new Point(_loc_9.x + _loc_11 / _loc_5, _loc_9.y + _loc_4 / _loc_6));
                _loc_7 = _loc_7 + 1;
            }
            _loc_4 = param1[(param1.length - 1)].y - param1[param1.length - 2].y;
            _loc_3 = param1[(param1.length - 1)].x - param1[param1.length - 2].x;
            _loc_2.push(new Point(param1[(param1.length - 1)].x - _loc_3 / _loc_5, param1[(param1.length - 1)].y - _loc_4 / 6));
            _loc_2.push(new Point(param1[(param1.length - 1)].x, param1[(param1.length - 1)].y));
            return _loc_2;
        }// end function

        private function drawBezierMidpoint(param1:Point, param2:Point, param3:Point, param4:Point) : void
        {
            var _loc_5:* = getPointOnSegment(param1, param2, 3 / 4);
            var _loc_6:* = getPointOnSegment(param4, param3, 3 / 4);
            var _loc_7:* = (param4.x - param1.x) / 16;
            var _loc_8:* = (param4.y - param1.y) / 16;
            var _loc_9:* = getPointOnSegment(param1, param2, 3 / 8);
            var _loc_10:* = getPointOnSegment(_loc_5, _loc_6, 3 / 8);
            _loc_10.x = _loc_10.x - _loc_7;
            _loc_10.y = _loc_10.y - _loc_8;
            var _loc_11:* = getPointOnSegment(_loc_6, _loc_5, 3 / 8);
            _loc_11.x = _loc_11.x + _loc_7;
            _loc_11.y = _loc_11.y + _loc_8;
            var _loc_12:* = getPointOnSegment(param4, param3, 3 / 8);
            var _loc_13:* = getMiddle(_loc_9, _loc_10);
            var _loc_14:* = getMiddle(_loc_5, _loc_6);
            var _loc_15:* = getMiddle(_loc_11, _loc_12);
            this.graphics.curveTo(_loc_9.x, _loc_9.y, _loc_13.x, _loc_13.y);
            this.graphics.curveTo(_loc_10.x, _loc_10.y, _loc_14.x, _loc_14.y);
            this.graphics.curveTo(_loc_11.x, _loc_11.y, _loc_15.x, _loc_15.y);
            this.graphics.curveTo(_loc_12.x, _loc_12.y, param4.x, param4.y);
            return;
        }// end function

        private function getPointOnSegment(param1:Point, param2:Point, param3:Number) : Point
        {
            var _loc_4:* = new Point(param1.x + (param2.x - param1.x) * param3, param1.y + (param2.y - param1.y) * param3);
            return _loc_4;
        }// end function

        private function getMiddle(param1:Point, param2:Point) : Point
        {
            var _loc_3:* = new Point((param1.x + param2.x) / 2, (param1.y + param2.y) / 2);
            return _loc_3;
        }// end function

    }
}
